#include <iostream>
#include <string>
#include <cstdlib>
#include <pthread.h>
#include <unistd.h>

using namespace std;

string toHex(pthread_t tid)
{
    char hex[64];
    snprintf(hex, sizeof(hex), "%p", tid);
    return hex;
}

void* threadRoutine(void* args)
{
    while (true)
    {
        cout << "thread id: " << toHex(pthread_self()) << endl;
        sleep(1);
    }
}

int main()
{
    pthread_t tid;
    pthread_create(&tid, nullptr, threadRoutine, (void*)"thread 1");

    cout << "main thread create thread done, new thread id: " << toHex(tid) << endl;
    pthread_join(tid, nullptr);
    return 0;
}



// 目前，我们的原生线程，pthread库——原生线程库
// C++11语言本身也已经支持多线程了 VS 原生线程库

// void threadrun()
// {
//     while (true)
//     {
//         cout << "I am a new thread for C++" << endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     thread t1(threadrun);

//     t1.join();

//     return 0;
// }




// class Request
// {
// public:
//     Request(int start, int end, string threadname)
//         : _start(start), _end(end), _threadname(threadname)
//     {
//     }

// public:
//     int _start;
//     int _end;
//     string _threadname;
// };

// class Response
// {
// public:
//     Response(int result, int exitcode)
//     :_result(result),_exitcode(exitcode)
//     {}
// public:
//     int _result;
//     int _exitcode;
// };

// void* sumCount(void* args) // 线程的参数和返回值，不仅仅可以用来进行传递一般参数，也可以传递对象
// {
//     Request* rq = static_cast<Request*>(args);
//     Response* rsp = new Response(0, 0);
//     for (int i = rq->_start; i <= rq->_end; i++)
//     {
//         cout << rq->_threadname << " is running, caling..., " << i << endl;
//         rsp->_result += i;
//         usleep(100000);
//     }
//     delete rq;
//     return rsp;
// }

// int main()
// {
//     pthread_t tid;
//     Request* rq = new Request(1, 100, "thread 1");
//     pthread_create(&tid, nullptr, sumCount, rq);

//     void* retval;
//     pthread_join(tid, &retval);
//     Response* rsp = static_cast<Response*>(retval);
//     cout << "result: " << rsp->_result << ", exitcode: " << rsp->_exitcode << endl;
//     delete rsp;
//     return 0;
// }




// int g_val = 100;
// // 可以被多个执行流同时执行,show函数被重入了
// void show(const string& name)
// {
//     cout << name << "say# " << "hello thread" << endl;
// }

// // new thread
// void* threadRoutine(void* args)
// {
//     const char* name = (const char*)args;
//     int cnt = 5;
//     while (1)
//     {
//         printf("%s, pid: %d, g_val: %d, &g_val: 0x%p\n", name, getpid(), g_val, &g_val);
//         // cout << "new thread, pid: " << getpid() << endl;
//         // show("[new thread]");
//         sleep(1);

//         // int a = 10;
//         // a /= 0;
//         cnt--;
//         if (cnt == 0)break;
//     }
//     // pthread_exit((void*)100);
//     // exit(11); // 直接调用exit， exit是用来终止进程的！不能用来终止线程！！！！
//     //return (void*)1; // 走到这里线程默认退出了
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadRoutine, (void*)"Thread 1");
//     sleep(1); // 保证新线程已经启动
//     pthread_cancel(tid);
//     // while (1)
//     // {
//     //     printf("main thread, pid: %d, g_val: %d, &g_val: 0x%p, create new thread tid: %p\n", getpid(), g_val, &g_val, tid);
//     //     // cout << "main thread, pid: " << getpid() << ", g_val: " << g_val << ", &g_val: " << &g_val << endl;
//     //     // show("[main thread]");
//     //     sleep(1);
//     //     g_val++;
//     // }

//     //sleep(7);
//     void* retval;
//     pthread_join(tid, &retval);
//     cout << "main thread quit..., ret: " << (long long int)retval << endl; // main thread等待的时候，默认是阻塞等待的, 为什么join的时候不考虑异常？做不到
//     return 0;
// }
